﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

//void test()
//{
//	class Person
//	{
//	public:
//		void func()
//		{
//			cout << "person:func()" << endl;
//		}
//
//	protected:
//		string _name; // 姓名
//		string _sex; // 性别
//		int _age; // 年龄
//	};
//	class Student : public Person
//	{
//	public:
//		void func()
//		{
//			cout << "student:func()" << endl;
//		}
//
//	public:
//		int _No; // 学号
//	};
//
//	Person per;
//	Student sobj;
//	// 1.派⽣类对象可以赋值给基类的指针/引⽤
//	//Person* pp = &sobj;
//	//Person& rp = sobj;
//
//	//Person* p1 = &per;
//
//	//p1->func();
//	//rp.func();
//
//	// ⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的
//	Person pobj = sobj;
//
//	pobj.func();
//
//	//2.基类对象不能赋值给派⽣类对象，这⾥会编译报错
//	//sobj = pobj;
//}
//
//int main()
//{
//	test();
//	return 0;
//}

// Student的_num和Person的_num构成隐藏关系，可以看出这样代码虽然能跑，但是⾮常容易混淆
//class Person
//{
//protected:
//	string _name = "⼩李⼦"; // 姓名
//	int _num = 111; // ⾝份证号
//};
//
//class Student : public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << " 身份证号:" << Person::_num << endl;
//		cout << " 学号:" << _num << endl;
//	}
//protected:
//	int _num = 999; // 学号
//};
//
//int main()
//{
//	Student s1;
//	s1.Print();
//	return 0;
//}


//class A
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void fun(int i = 0)
//	{
//		cout << "func(int i)" << i << endl;
//	}
//};
//int main()
//{
//	B b;
//	b.fun(10);
//	b.fun();
//	return 0;
//}


//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl; }
//};
//void Func(Person* ptr)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	ptr->BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//	return 0;
//}

//class Person {
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//};
//class Student : public Person {
//public:
//	virtual void BuyTicket() { cout << "买票-打折" << endl; }
//};
//void Func(Person ref)
//{
//	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket
//	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
//	ref.BuyTicket();
//}
//int main()
//{
//	Person ps;
//	Student st;
//	Func(ps);
//	Func(st);
//	return 0;
//}


class Base {
public:
	virtual void func1() { cout << "Base::func1" << endl; }
	virtual void func2() { cout << "Base::func2" << endl; }
	void func5() { cout << "Base::func5" << endl; }
protected:
	int a = 1;
};

class Derive : public Base
{
public:
	// 重写基类的func1
	virtual void func1() { cout << "Derive::func1" << endl; }
	virtual void func3() { cout << "Derive::func1" << endl; }
	void func4() { cout << "Derive::func4" << endl; }
protected:
	int b = 2;
};

//int main()
//{
//	Base b;
//	Derive d;
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	static int j = 1;
//	int* p1 = new int;
//	const char* p2 = "xxxxxxxx";
//	printf("栈:%p\n", &i);
//	printf("静态区:%p\n", &j);
//	printf("堆:%p\n", p1);
//	printf("常量区:%p\n", p2);
//	Base b;
//	Derive d;
//	Base* p3 = &b;
//	Derive* p4 = &d;
//	printf("Person虚表地址:%p\n", (int*)p3);
//	printf("Student虚表地址:%p\n", (int*)p4);
//
//	cout << "////////////////////////////////" << endl;
//	printf("Person地址:%p\n", p3);
//	printf("Student地址:%p\n", p4);
//
//	cout << "////////////////////////////////" << endl;
//
//	printf("虚函数地址:%p\n", &Base::func1);
//	printf("普通函数地址:%p\n", &Base::func5);
//	return 0;
//}

class A 
{ 
	public: void test(float a) { cout << a; } 
}; 

class B :public A 
{ 
	public: void test(int b) { cout << b; } 
}; 

int main()
{
	A* a = new A; 
	B* b = new B; 
	a = b; 
	a->test(1.1);
	return 0;
}